package etm.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import upc.condominio.modelo.Acuerdo;
import upc.condominio.modelo.Dirigente;
import upc.condominio.modelo.Junta;
import upc.condominio.modelo.Residente;
import upc.condominio.util.ConexionBD;
import etm.excepcion.DAOExcepcion;

public class JuntaDAO extends BaseDAO {

	public Collection<Junta> buscarPorDato(String dato) throws DAOExcepcion {
		System.out.println("JuntaDAO: buscarPorDato(String dato)");
		String strQuery =	" select idjunta, fecha, hora, tema " +
							" from junta " +
							" where tema like ? ;";
		Collection<Junta> lista = new ArrayList<Junta>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setString(1, "%" + dato + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Junta vo = new Junta();
				vo.setIdJunta(rs.getInt("idjunta"));				
				vo.setFecha(rs.getDate("fecha"));
				vo.setHora(rs.getTime("hora"));
				vo.setTema(rs.getString("tema"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Junta buscarporId(int intIdJunta) throws DAOExcepcion {
		Junta res =null;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		Collection<Dirigente> ds = new ArrayList<Dirigente>();
		Collection<Acuerdo> as = new ArrayList<Acuerdo>();
		
		try {
			System.out.println("bucando junta");
			con = ConexionBD.obtenerConexion();
			String StrQuery = 	" SELECT idjunta, fecha, hora, tema " + 
							" from junta " +
							" where idjunta = ?";
			stmt = con.prepareStatement(StrQuery);
			stmt.setInt(1, intIdJunta);
			rs = stmt.executeQuery();
			while (rs.next()) {
				res = new Junta();
				res.setIdJunta(rs.getInt(1));
				res.setFecha(rs.getDate(2));
				res.setHora(rs.getTime(3));
				res.setTema(rs.getString(4));
				break;
			}
			
			// Recuperar dirigentes
			System.out.println("bucando dirigentes");
			StrQuery = 	" SELECT d.idresidente, r.nombres, r.apellidopaterno, r.apellidomaterno " + 
					" from dirigente d inner join residente r on (d.idresidente = r.idresidente) " +
					" where d.idjunta = ?" +
					" order by d.idresidente ";
			stmt = con.prepareStatement(StrQuery);
			stmt.setInt(1, intIdJunta);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente r = new Residente();
				r.setIdResidente(rs.getInt(1));
				r.setNombres(rs.getString(2));
				r.setApePaterno(rs.getString(3));
				r.setApeMaterno(rs.getString(4));
				
				Dirigente d = new Dirigente(intIdJunta, r, "");
				ds.add(d);
			}
			
			res.setDetalleDirigente(ds);
			
			// Recuperar acuerdos
			System.out.println("bucando acuerdos");
			StrQuery = 	" SELECT idacuerdo, nombre " + 
					" from acuerdo " +
					" where idjunta = ? " +
					" order by idacuerdo ";
			stmt = con.prepareStatement(StrQuery);
			stmt.setInt(1, intIdJunta);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Acuerdo r = new Acuerdo();
				r.setIdAcuerdo(rs.getInt(1));
				r.setNombre(rs.getString(2));
				as.add(r);
			}
			
			res.setDetalleAcuerdo(as);
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return res;
	}
	
	public Junta insertarJunta(Junta vo) throws DAOExcepcion {
		System.out.println("JuntaDAO: insertarJunta(Junta vo)");
		String strQuery = 	" INSERT INTO junta(fecha, hora, tema) "+
							" VALUES (?,?,?) ";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setDate(1, vo.getFecha());
			stmt.setTime(2, vo.getHora());
			stmt.setString(3, vo.getTema());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en junta");
			}
			// Obtener el ultimo id
			int id = 0;
			strQuery = "select last_insert_id()";
			stmt = con.prepareStatement(strQuery);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdJunta(id);
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	
	public Collection<Dirigente> insertarDirigente(int intIdJunta, int intIdResidente) throws DAOExcepcion {
		System.out.println("JuntaDAO: insertarDirigente(int intIdJunta, int intIdResidente)");
		String strQuery = 	" INSERT INTO dirigente(idjunta, idresidente) "+
							" VALUES (?,?) ";
		Collection<Dirigente> ds = new ArrayList<Dirigente>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setInt(1,intIdJunta);
			stmt.setInt(2, intIdResidente );
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en dirigente");
			}
			
			Junta jt = buscarporId(intIdJunta);
			ds = jt.getDetalleDirigente();
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return ds;
	}
	
	public Collection<Acuerdo> insertarAcuerdo(int intIdJunta, String strNonbre) throws DAOExcepcion {
		System.out.println("JuntaDAO: insertarAcuerdo(int intIdJunta, Acuerdo vo)");
		String strQuery;
		Collection<Acuerdo> ds = new ArrayList<Acuerdo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			
			// Obtener el ultimo id
			int id = 0;
			strQuery = "select max(idacuerdo) id from acuerdo where idjunta = ? ";
			System.out.println(strQuery);
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setInt(1,intIdJunta);
			rs = stmt.executeQuery();
			System.out.println("JuntaDAO: Recuperadno id0");
			if (rs!=null){
				System.out.println("JuntaDAO: Recuperadno id2");
			if (rs.next()) {
				System.out.println("JuntaDAO: Recuperadno id4");
				id = rs.getInt(1);
			}}
			else
			{id=0;}
			id++;
			
			
						
			strQuery = 	" INSERT INTO acuerdo(idjunta, idacuerdo, nombre) "+
						" VALUES (?, ?, ?) ";
			stmt = con.prepareStatement(strQuery);
			stmt.setInt(1,intIdJunta);
			stmt.setInt(2, id);
			stmt.setString(3, strNonbre);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar en junta");
			}
			
			Junta jt = buscarporId(intIdJunta);
			ds = jt.getDetalleAcuerdo();
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return ds;
	}
	
//	public void eliminar(int intIdResidente) throws DAOExcepcion {
//		System.out.println("JuntaDAO: eliminar(int intIdResidente)");
//		String StrQuery = "Update residente set idestado ='IN' WHERE idresidente=?; ";
//		Connection con = null;
//		PreparedStatement stmt = null;
//		try {
//			Residente q = buscarporId(intIdResidente);
//			
////			if (q.getEstEstado().getIdEstado().equalsIgnoreCase("AN")) {
////				throw new SQLException("el registro ya se encuentra anulado.");
////			}
//			
//			con = ConexionBD.obtenerConexion();
//			stmt = con.prepareStatement(StrQuery);
//			stmt.setInt(1, intIdResidente);
//			int i = stmt.executeUpdate();
//			if (i != 1) {
//
//				throw new SQLException("No se pudo anular el registro.");
////				return false;
//			}
//			
//		} catch (SQLException e) {
//			System.err.println(e.getMessage());
//			throw new DAOExcepcion(e.getMessage());
////			return false;
//		} finally {
//			this.cerrarStatement(stmt);
//			this.cerrarConexion(con);
//		}
////		return true;
//	}
	
	public void actualizar(Junta vo) throws DAOExcepcion {
		System.out.println("JuntaDAO: actualizar(Residente vo)");
		String query = "update junta set fecha = ?, hora = ?, tema = ?  where idjunta=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDate(1, vo.getFecha());
			stmt.setTime(2, vo.getHora());
			stmt.setString(3, vo.getTema());
			stmt.setInt(4, vo.getIdJunta());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar el registro junta");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void EliminaDirigente(int intIdJunta, int intIdResidente) throws DAOExcepcion {
		System.out.println("JuntaDAO: EliminaDirigente(int intIdJunta, int intIdResidente)");
		String strQuery = 	" delete from dirigente where idjunta = ? and idresidente = ? ";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setInt(1,intIdJunta);
			stmt.setInt(2, intIdResidente );
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar en dirigente");
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public void EliminaAcuerdo(int intIdJunta, int intIdAcuerdo) throws DAOExcepcion {
		System.out.println("JuntaDAO: EliminaDirigente(int intIdJunta, int intIdResidente)");
		String strQuery = 	" delete from acuerdo where idjunta = ? and idacuerdo = ? ";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(strQuery);
			stmt.setInt(1,intIdJunta);
			stmt.setInt(2, intIdAcuerdo );
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar en acuerdo");
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
}
